﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ChampionFramework.Models;

namespace ChampionFramework.Controllers
{
    public class JogoGrupoController : Controller
    {
        private ChampionContextContainer db = new ChampionContextContainer();

        public ActionResult Create(int id = 0)
        {
            this.LoadSelectLists(id);
            return View();
        }

        private void LoadSelectLists(int grupoId)
        {
            Grupo grupo = db.GrupoSet.Single(g => g.Id == grupoId);
            ViewBag.TimeVisitanteId = new SelectList(grupo.Time , "Id", "Nome");
            ViewBag.TimeMandanteId = new SelectList(grupo.Time, "Id", "Nome");
            ViewBag.GrupoId = new SelectList(db.GrupoSet.Where(g => g.Id == grupoId), "Id", "Nome");
            ViewBag.GrupoIdLink = grupoId;
        }

        [HttpPost]
        public ActionResult Create(JogoGrupo jogoGrupo)
        {
            int timeVisitanteId = Convert.ToInt32(this.Request.Params["TimeVisitanteId"]);
            int timeMandanteId = Convert.ToInt32(this.Request.Params["TimeMandanteId"]);
            int grupoId = Convert.ToInt32(this.Request.Params["GrupoId"]);
            if (timeMandanteId == timeVisitanteId)
            {
                this.LoadSelectLists(grupoId);
                throw new Exception("Os times partipantes do jogo devem ser diferentes");
            }
            jogoGrupo.GetReadyForCreating(db, timeMandanteId, timeVisitanteId);
            if (ModelState.IsValid)
            {                
                db.JogoSet.AddObject(jogoGrupo);
                db.SaveChanges();
                return RedirectToAction("Details", "Grupos", new { id = grupoId });
            }
            this.LoadSelectLists(grupoId);
            return View();
        }

        public ActionResult EscalarTimes(int id = 0)
        {
            this.LoadSelectListsEscalacao(id);            
            return View();
        }

        private void LoadSelectListsEscalacao(int jogoGrupoId)
        {
            ViewBag.JogoGrupoId = jogoGrupoId;
            JogoGrupo jogoGrupo = db.JogoSet.OfType<JogoGrupo>().Single(j => j.Id == jogoGrupoId);
            var jogadoresMandante = jogoGrupo.GetEscalacaoMandante().Time.Jogador.Take(18).ToList();
            var jogadoresVisitante = jogoGrupo.GetEscalacaoVisitante().Time.Jogador.Take(18).ToList();
            ViewBag.JogadoresMandante = jogadoresMandante;
            ViewBag.JogadoresVisitante = jogadoresVisitante;
        }

        [HttpPost]
        public ActionResult EscalarTimes()
        {
            int jogoGrupoId = Convert.ToInt32(this.Request.Params["JogoGrupoId"]);
            JogoGrupo jogoGrupo = db.JogoSet.OfType<JogoGrupo>().Single(j => j.Id == jogoGrupoId);
            for (int i = 0; i < 11; i++)
            {
                int jogadorId = Convert.ToInt32(this.Request.Params[String.Format("JogadoresTitularesMandante{0}", i)]);
                Jogador jogador = db.JogadorSet.Single(j => j.Id == jogadorId);                
                jogoGrupo.GetEscalacaoMandante().JogadorTitular.Add(jogador);
                db.ObjectStateManager.ChangeObjectState(jogoGrupo, EntityState.Modified);
            }
            for (int i = 0; i < 7; i++)
            {
                int jogadorId = Convert.ToInt32(this.Request.Params[String.Format("JogadoresReservasMandante{0}", i)]);
                Jogador jogador = db.JogadorSet.Single(j => j.Id == jogadorId);
                jogoGrupo.GetEscalacaoMandante().JogadorReserva.Add(jogador);
                db.ObjectStateManager.ChangeObjectState(jogoGrupo, EntityState.Modified);
            }
            for (int i = 0; i < 11; i++)
            {
                int jogadorId = Convert.ToInt32(this.Request.Params[String.Format("JogadoresTitularesVisitante{0}", i)]);
                Jogador jogador = db.JogadorSet.Single(j => j.Id == jogadorId);
                jogoGrupo.GetEscalacaoVisitante().JogadorTitular.Add(jogador);
                db.ObjectStateManager.ChangeObjectState(jogoGrupo, EntityState.Modified);
            }
            for (int i = 0; i < 7; i++)
            {
                int jogadorId = Convert.ToInt32(this.Request.Params[String.Format("JogadoresReservasVisitante{0}", i)]);
                Jogador jogador = db.JogadorSet.Single(j => j.Id == jogadorId);
                jogoGrupo.GetEscalacaoVisitante().JogadorReserva.Add(jogador);
                db.ObjectStateManager.ChangeObjectState(jogoGrupo, EntityState.Modified);
            }
            db.SaveChanges();
            this.LoadSelectListsEscalacao(jogoGrupoId);
            return RedirectToAction("Details", "Grupos", new { id = jogoGrupo.GrupoId });

        }

        public ActionResult TempoReal(int id = 0)
        {
            JogoGrupo jogoGrupo = db.JogoSet.Include("Etapa").OfType<JogoGrupo>().Single(j => j.Id == id);
            int[] placar = jogoGrupo.GetPlacar();
            ViewBag.MandantePlacar = placar[0];
            ViewBag.VisitantePlacar = placar[1];
            if (!jogoGrupo.Iniciado())
            {
                jogoGrupo.Iniciar(db);
            }
            return View(jogoGrupo);
        }

        [HttpPost]
        public ActionResult TempoReal(JogoGrupo jogoGrupo)
        {
            jogoGrupo = db.JogoSet.Include("Etapa").OfType<JogoGrupo>().Single(j => j.Id == jogoGrupo.Id);
            if (!jogoGrupo.GetEtapaAtual().Iniciada)
                jogoGrupo.IniciarEtapaAtual(db);
            else
            {
                jogoGrupo.EncerrarEtapaAtual(db);
                if (jogoGrupo.Encerrado)
                    return RedirectToAction("Details", "Grupos", new { id = jogoGrupo.Grupo.Id });
            }
            return this.RedirectToAction("TempoReal", new { id = jogoGrupo.Id });
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}